home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / popup.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  9KB  |  430 lines

  1. /*
  2.  * popup.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Routines de gestion de menus POP-UP
  7.  *
  8.  * Notes:
  9.  * ------
  10.  * This template is designed to ease program maintainance
  11.  *
  12.  * Suggest:
  13.  * --------
  14.  * Keep comments up to date, all the time!
  15.  *
  16.  * History:
  17.  * --------
  18.  * 1993: fplanque: Created
  19.  */
  20.  
  21.  
  22.      #include "!OPTIONS.H"                /* Options de compilation */         
  23.     #define    THIS_FILE    "POPUP.C v1.10 - 03.95"
  24.           
  25.  
  26. /*
  27.  * System headers:
  28.  */
  29.     #include    <stdio.h>
  30.     #include    <string.h>                    /* strlen() etc.. */
  31.     #include    <aes.h>                        /* header AES */
  32.    
  33.  
  34. /*
  35.  * Custom headers:
  36.  */
  37.     #include    "POPUP.H"    
  38.  
  39.     #include "SPEC_PU.H"
  40.     #include "S_MALLOC.H"
  41.     #include "DEBUG_PU.H"
  42.     #include "TEXT_PU.H"                        /* D‚finitions texte */
  43.     #include    "EXFRM_PU.H"            
  44.     #include "OBJCT_PU.H"    
  45.  
  46.    
  47. /*
  48.  * ------------------------ VARIABLES -------------------------
  49.  */
  50.  
  51.     extern    int        G_x_mini, G_y_mini;        /* Coord sup gauche de l'‚cran */
  52.     extern    int        G_w_maxi, G_h_maxi;        /* Taille de l'‚cran de travail */
  53.     extern    VDI_TEXT_PARAMS    G_aes_text;        /* ParamŠtres texte AES */
  54.  
  55. /*
  56.  * Private variables: 
  57.  */
  58.     static OBJECT M_basic_popup[] = {
  59.                 -1, -1, -1, G_BOX, NONE, SHADOWED, 0xFF1100L, 1,1, 12*8,10*16,
  60.                  0, -1, -1, G_STRING, TOUCHEXIT|SELECTABLE, NORMAL, 0x0L, 0,0, 12*8,1*16};
  61.      
  62.  
  63. /*
  64.  * ------------------------ FUNCTIONS -------------------------
  65.  */
  66.  
  67.  
  68. /*
  69.  * PopUp_Init(-)
  70.  *
  71.  * Purpose:
  72.  * --------
  73.  * Init gestion des menus Pop-Up
  74.  *
  75.  * History:
  76.  * --------
  77.  * 13.02.95: fplanque: Created
  78.  */
  79. void    PopUp_Init( void )
  80. {
  81.     TRACE0( "Initializing " THIS_FILE );
  82.  
  83.     /*
  84.      * Fixe taille d'une ligne popup en fonction de la r‚solution:
  85.      */
  86.     M_basic_popup[ 1 ] .ob_height = G_aes_text .cell_h;
  87. }
  88.  
  89.  
  90. /*
  91.  * popup(-)
  92.  *
  93.  * Purpose:
  94.  * --------
  95.  * Gestion d'un menu Pop-Up
  96.  *
  97.  * Notes:
  98.  * ------
  99.  * N'utilise PAS junk1
  100.  *
  101.  * History:
  102.  * --------
  103.  * fplanque: Created
  104.  */
  105. int    popup( 
  106.             int pop_x, 
  107.             int pop_y, 
  108.             POPUP_ENTRY *entries,     /* In: Menu … d‚rouler */
  109.             int current_val )            /* In: Valeur courante -> re‡oit un Checkmark! */
  110. {
  111.     /*
  112.      * Variables: 
  113.      */
  114.     int        nb_entries = 0;        /* Nombre d'options du menu */
  115.     char        *curr_name;                /* Nom en cours de traitement */
  116.     int        checked_item = NIL;    /* No de l'option devant laquelle on a plac‚ une checkmark */
  117.     int        i;    
  118.     int        line_width;                /* Largeur de la ligne courante */
  119.     int        menu_width = 0;        /* Largeur requise pour le menu */
  120.     GRECT        popup_box;                /* Coordonn‚es sur l'‚cran: */
  121.     OBJECT    *popup_tree;            /* Arbre Popup */
  122.     int        edit = 0;                /* Bidon */
  123.     int        exit_obj;                /* Objet de sortie */
  124.  
  125.     /* 
  126.      * Parcourt les lignes: 
  127.      */
  128.     while(    curr_name = entries[ nb_entries ] .name,
  129.                 curr_name != NULL )
  130.     {
  131.         /*
  132.          * Contr“le de la largeur 
  133.          */
  134.         line_width = (int) strlen( curr_name );    /* Long ligne courante */
  135.         if ( line_width > menu_width )
  136.         {    /*
  137.              * Si cette ligne est plus longue que les autres: 
  138.              */
  139.             menu_width = line_width;    /* Nlle largeur du menu */
  140.         }
  141.  
  142.         /*
  143.          * Contr“le Checkmark 
  144.          */
  145.         if ( checked_item == NIL && entries[ nb_entries ] .value == current_val )
  146.         {    /*
  147.              * Si on a trouv‚ l'option courante: 
  148.              */ 
  149.             curr_name[ 0 ] = CHECK ;    /* Place checkmark */
  150.             checked_item = nb_entries;    /* M‚morise no de la ligne */
  151.         }
  152.  
  153.         /*
  154.          * Une option de plus dans le menu: 
  155.          */
  156.         nb_entries++;
  157.     }
  158.  
  159.     /*
  160.      * Augmente la largeur du menu de la taille d'un caractŠre: 
  161.      * (Pour laisser un espace … droite) 
  162.      */
  163.     menu_width ++;    
  164.     /*
  165.      * Convertit la largeur en pixels: 
  166.      */
  167.     menu_width *= G_aes_text .cell_w;
  168.  
  169.     /* 
  170.      * Cr‚e l'arbre d'objet: 
  171.      * R‚serve de la place pour les lignes texte et le pŠre: 
  172.      */
  173.     popup_tree = (OBJECT *) MALLOC( sizeof( OBJECT ) * (nb_entries+1) );
  174.     /*
  175.      * Copie le pŠre: 
  176.      */
  177.     memcpy( popup_tree, M_basic_popup, sizeof( OBJECT ) );
  178.     /*
  179.      * Fixe position du pŠre: 
  180.      */
  181.     popup_tree[ 0 ] .ob_x = pop_x;
  182.     /*
  183.      * Fixe largeur du pŠre: 
  184.      */
  185.     popup_tree[ 0 ] .ob_width = menu_width;
  186.  
  187.     /* 
  188.      * Fixe la largeur de l'objets-STRING servant de modŠle aux lignes qui vont ˆtre ajout‚es au menu: 
  189.      */
  190.     M_basic_popup[ 1 ] .ob_width = menu_width;
  191.  
  192.     /* 
  193.      * Ajoute les entr‚es popup: 
  194.      */
  195.     for( i=1; i<=nb_entries; i++ )
  196.     {
  197.         /*
  198.          * Ajoute un objet STRING: 
  199.          */
  200.         memcpy( &popup_tree[ i ], &M_basic_popup[ 1 ], sizeof( OBJECT ) );
  201.         /*
  202.          * Modifie les liens pour le ratacher au pŠre: 
  203.          */
  204.         objc_add( popup_tree, 0, i );
  205.         /*
  206.          * Fixe sa position: 
  207.          */
  208.         popup_tree[ i ] .ob_y = G_aes_text .cell_h * (i-1);
  209.         /*
  210.          * Fixe ptr sur la chaine-texte concern‚e: 
  211.          */
  212.         popup_tree[ i ] .ob_spec.free_string = entries[ i-1 ] .name;
  213.     }
  214.     /*
  215.      * Dernier objet: 
  216.      */
  217.     popup_tree[ i-1 ] .ob_flags |= LASTOB;
  218.     
  219.     /*
  220.      * Fixe hauteur totale du pŠre: 
  221.      */
  222.     popup_tree[ 0 ] .ob_height = G_aes_text .cell_h * (i-1);
  223.  
  224.     /* 
  225.      * Position verticale: Contr“le si on ne d‚passe pas le bord de l'‚cran: 
  226.      */
  227.     if ( pop_y + popup_tree[ 0 ] .ob_height > G_y_mini + G_h_maxi -2 )
  228.     {    /*
  229.          * Si on d‚passe le bas: 
  230.          */
  231.         popup_tree[ 0 ] .ob_y = G_y_mini + G_h_maxi - 2 - popup_tree[ 0 ] .ob_height;
  232.     }
  233.     else
  234.     {
  235.         popup_tree[ 0 ] .ob_y = pop_y;
  236.     }
  237.  
  238.     /* 
  239.      * Gestion "formulaire": 
  240.      */
  241.     open_panel( popup_tree, NULL, &popup_box, FALSE0 );    
  242.  
  243.     exit_obj = ext_form_gest( popup_tree, &edit, TRUE_1 );
  244.  
  245.     close_pannel( popup_tree, exit_obj, &popup_box );     
  246.  
  247.     /*
  248.      * LibŠre m‚moire occup‚e par le pop-up: 
  249.      */
  250.     FREE( popup_tree );
  251.  
  252.     /* 
  253.      * EnlŠve checkmark: 
  254.      */
  255.     if ( checked_item != NIL )
  256.     {    /*
  257.          * Si on a plac‚ une checkmark: 
  258.          */
  259.         entries[ checked_item ] .name[ 0 ] = ' ';    /* EnlŠve */
  260.     }
  261.  
  262.     /* 
  263.      * Valeur en retour: 
  264.      */
  265.     if ( exit_obj != NIL )
  266.     {    /*
  267.          * Si on a s‚lectionn‚ une option: 
  268.          * Retourne no de ligne s‚lectionn‚e [0...x] 
  269.          */
  270.         return    entries[ -- exit_obj ] .value;
  271.     }
  272.     else
  273.     {    /*
  274.          * On a cliqu‚ hors du menu : rien s‚lectionn‚: 
  275.          */
  276.         return    ABORT_2;        /* (-2) */
  277.     }
  278. }
  279.  
  280.  
  281.  
  282.  
  283. /*
  284.  * popup_inform(-)
  285.  *
  286.  * Purpose:
  287.  * --------
  288.  * Appel d'un menu Pop-Up depuis un Formulaire
  289.  *
  290.  * Notes:
  291.  * ------
  292.  * N'utilise PAS junk1
  293.  *
  294.  * History:
  295.  * --------
  296.  * fplanque: Created
  297.  */
  298. int    popup_inform(                     /* Out: Valeur s‚lectionn‚e */
  299.             OBJECT *call_form,         /* In:  Formulaire appellant */
  300.             int call_obj,                 /* In:  Objet appellant */
  301.             int title_obj,             /* In:  No Objet sur lequel le menu va s'aligner (Titre de menu) */
  302.             POPUP_ENTRY *entries,     /* In:  Menu Pop-Up … d‚rouler */
  303.             int current_val )            /* In:  Valeur courante -> recevra checkmark */
  304. {
  305.     int    selected_value;
  306.  
  307.     /* 
  308.      * D‚termine coordonn‚es du Popup: 
  309.      */
  310.     int    pop_x, pop_y;
  311.     objc_offset( call_form, title_obj, &pop_x, &pop_y );
  312.     pop_y += call_form[ title_obj ] .ob_height +2;
  313.  
  314.     /*
  315.      * Appelle Popup 
  316.      */
  317.     selected_value = popup( pop_x, pop_y, entries, current_val );
  318.     
  319.     /* 
  320.      * D‚s‚lectionne objet qui a appell‚ le Pop-Up: 
  321.      */
  322.     objc_dsel( call_form, call_obj );
  323.  
  324.     /* 
  325.      * Retourne no de la ligne s‚lectionn‚e: 
  326.      */
  327.     return    selected_value;
  328.  
  329. }
  330.  
  331.  
  332.  
  333. /*
  334.  * get_popup_name(-)
  335.  *
  336.  * Purpose:
  337.  * --------
  338.  * Renvoie le nom de l'option correspondant … la valeur donn‚e 
  339.  * d'aprŠs un menu popup.
  340.  *
  341.  * History:
  342.  * --------
  343.  * 14.03.95: fplanque: Extracted from fix_popup_title()
  344.  */
  345. const char * get_popup_name(             /* Out: Nom correspondant ou "" */
  346.             POPUP_ENTRY *    entries,     /* In:  Menu Pop-Up */
  347.             int                 n_val )        /* In:  Valeur … rechercher */
  348. {
  349.     int    i = 0;        /* Compteur */
  350.  
  351.     /* 
  352.      * Cherche l'option courante: 
  353.      */
  354.     while( entries[ i ] .name != NULL )
  355.     {
  356.         if ( entries[ i ] .value == n_val )
  357.         {    /*
  358.              * Si on a trouv‚ l'option actuelle 
  359.              * Fixe nom dans titre: 
  360.              */
  361.             return    entries[ i ] .name +2;    /* Saute les espaces */
  362.         }
  363.     
  364.         /*
  365.          * Passe au suivant: 
  366.          */
  367.         i++;
  368.     }
  369.  
  370.     /*
  371.      * On a pas trouv‚:
  372.      */
  373.     return    G_empty_string;
  374. }
  375.  
  376.  
  377. /*
  378.  * Popup_GetCurrVal(-)
  379.  *
  380.  * Purpose:
  381.  * --------
  382.  * Renvoie la valeur courament stock‚e dans un menu popup
  383.  *
  384.  * History:
  385.  * --------
  386.  * 14.03.95: fplanque: Extracted from fix_popup_title()
  387.  */
  388. int    Popup_GetCurrVal( 
  389.             OBJECT        *    popup_title )     /* In: Objet titre de Menu */
  390. {
  391.     /*
  392.      * Junk1 contient la valeur actuelle! 
  393.      */
  394.     return    popup_title -> ob_spec.tedinfo -> te_junk1;
  395. }
  396.  
  397. /*
  398.  * fix_popup_title(-)
  399.  *
  400.  * Purpose:
  401.  * --------
  402.  * Fixe le nom de l'option courament s‚lectionn‚e 
  403.  * dans le titre d'un menu Pop-Up
  404.  *
  405.  * Suggest:
  406.  * --------
  407.  * Ne pas sauver de valeur dans Junk_1
  408.  *
  409.  * History:
  410.  * --------
  411.  * 1993: fplanque: Created
  412.  * 14.03.95: appelle get_popup_name()
  413.  */
  414. void    fix_popup_title( 
  415.             OBJECT        *    popup_title,     /* In: Objet titre de Menu */
  416.             POPUP_ENTRY *    entries,             /* In: Menu Pop-Up associ‚ */
  417.             int                 current_val )    /* In: Valeur … assigner au titre */
  418. {
  419.     const char * cpsz_Title = get_popup_name( entries, current_val );
  420.  
  421.     dlink_teptext( popup_title, cpsz_Title );    /* Saute les espaces */
  422.     
  423.     /* 
  424.      * (Autoris‚?!?) Sauve la valeur courante dans Junk1: 
  425.      */
  426.     (popup_title -> ob_spec.tedinfo) -> te_junk1 = current_val;
  427.     /* printf("Junk1=%d Junk2=%d \r", (M_ed_saisie[ exit_obj ] .ob_spec.tedinfo) -> te_junk1, (M_ed_saisie[ exit_obj ] .ob_spec.tedinfo) -> te_junk2 ); */
  428.  
  429. }
  430.